package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.BaseContext;
import com.itheima.common.MessageConstant;
import com.itheima.domain.Category;
import com.itheima.mapper.CategoryMapper;
import com.itheima.service.CategoryService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author: shan
 * @description:菜品、套餐分类管理业务实现
 * @create: 2022-06-05 11:10
 * @Version 1.0
 **/
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * @return
     * @Author shan
     * @Description //TODO 分页查询
     * @Date 16:55
     * @Param
     **/
    @Override
    public Page<Category> page(Integer page, Integer pageSize) {
        //1.校验、异常判断
        if (page < 1) {
            page = 1;
        }
        if (pageSize < 1) {
            pageSize = 10;
        }
        //2.构建分页条件、查询条件(没有可以使用NULL)
        Page<Category> page1 = new Page<>(page, pageSize);
        //3.执行查询
        Page<Category> pageResult = categoryMapper.selectPage(page1, null);
        //4.返回结果
        return pageResult;
    }

    /**
     * @return
     * @Author shan
     * @Description //TODO 修改
     * @Date 16:55
     * @Param
     **/
    @Override
    public int update(Category category) {
        int row = 0;
        //1.校验参数
        if (category == null) {
            return row;
        }
        //2.判断修改后的“分类名称”是否已经存在，如果已经存在则返回“分类名称已经存在，请重新输入分类名称”友好错误提示
        String name = category.getName();
        //根据前端传递过来的【name】,判断数据库是否有名称一致的分类
        Category one;
        if (StringUtils.isNotBlank(name)) {
            LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Category::getName, name);
            one = categoryMapper.selectOne(wrapper);
            // 2.1）如果名称一致，但是ID不一致，说明我们把分类名称改成了一个已经存在的分类名称----不允许修改
            if (one != null && !category.getId().equals(one.getId())) {
                throw new RuntimeException(MessageConstant.CAT_NAME_IS_EXIST);
            }
        }
        // 2.2)如果名称一致并且ID也一致，说明我们没有改该分类名称，可能修改了排序----允许修改
        Long userId = BaseContext.getCurrentId();
        row = categoryMapper.updateById(category);
        return row;
    }

    /**
     * @return
     * @Author shan
     * @Description //TODO 根据id删除
     * @Date 16:55
     * @Param
     **/
    @Override
    public int deleteById(Long id) {
        int row = 0;
        //1.校验参数
        if (id == null) {
            return row;
        }
        //2.判断该分类下是否有菜品、套餐，如果有不允许删除
        //3.该分类下没有菜品、套餐，删除该分类
        row = categoryMapper.deleteById(id);
        return row;
    }
    /** @Author shan
     * @Description //TODO 新增菜品或套餐分类
     * @Date 10:20 
     **/
    @Override
    public int save(Category category) {
        int row = 0;
        //1.校验参数
        if (category == null) {
            return row;
        }
        //2.保存分类
        row = categoryMapper.insert(category);
        return row;
    }

    @Override
    public List<Category> findAll(Integer type) {
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        if (type != null) {
            wrapper.eq(Category::getType, type);
        }
        //wrapper.select(Category::getId,Category::getName,Category::getType);
        //先根据sort字段升序排序（值越小优先级越高）
        wrapper.orderByAsc(Category::getSort);
        //再根据更新时间排序，sort一致时，时间越新越靠前
        wrapper.orderByDesc(Category::getUpdateTime);
        List<Category> categoryList = categoryMapper.selectList(wrapper);
        return categoryList;
    }


}